package com.qz.stack;


import java.util.Scanner;

/**
 * @Description
 * @Author Flag
 * @Date: 2021/7/19 21:25
 * @Version: 1.0
 **/
public class ArrayStackDome {
    public static void main(String[] args) {

        //测试一下ArrayStack是否正常
        //先创建一个ArrayStack对象->表示栈
        ArrayStack stack = new ArrayStack(4);
        String key = "";
        boolean loop = true;//用于控制是否退出
        Scanner scanner = new Scanner(System.in);
        while (loop){
            System.out.println("show:表示显示栈");
            System.out.println("exit:退出程序");
            System.out.println("push:表示添加元素到栈(入栈)");
            System.out.println("pop:表示从栈取出数据(出战)");

            System.out.println("请输入你的选择:");
            key = scanner.next();

            switch (key){
                case "show":
                    stack.show();
                    break;
                case "exit":
                    scanner.close();
                    loop = false;
                    break;
                case "push":
                    System.out.println("请输入一个数字");
                    int i = scanner.nextInt();
                    stack.push(i);
                    break;
                case "pop":
                    try{
                        int pop = stack.pop();
                        System.out.println("出栈的数据:"+pop);
                    } catch (Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                default:
                    break;
            }


        }

    }
}


class ArrayStack{
    //定义栈的大小
    private int maxSize;
    //数组，数组模拟栈，数据就放在该数组中
    private int[] stack;
    //top表示栈顶，初始化是-1
    private int top;

    /**
     * 构造方法
     * @param maxSize 栈的大小
     */
    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[maxSize];
        top = -1;
    }

    /**
     * 判断栈是否满了
     * @return
     */
    public boolean isFull(){
        return top+1 == maxSize;
    }

    /**
     * 入栈
     * @param value 入栈的元素
     */
    public void push(int value){
        //判断栈是否满了
        if(this.isFull()){
            System.out.println("栈已经满了,不能再添加元素");
            return;
        }
        //将元素添加到栈中
        stack[++top] = value;
    }


    /**
     * 出栈
     * @return 出栈的元素
     */
    public int pop(){
        //判断栈是否为null
        if(this.isEmpty()){
            throw new RuntimeException("栈中没有元素");
        }
        //将元素出栈
        return stack[top--];

    }


    /**
     * 显示栈的元素
     */
    public void show(){
        //判断栈是否为null
        if(this.isEmpty()){
            System.out.println("栈中无元素");
            return;
        }
        int index = top;
        while (index >= 0){
            System.out.println("元素:"+stack[index]);
            index--;
        }
    }

    /**
     * 判断栈是否为null
     * @return 结果
     */
    public boolean isEmpty(){
        return top == -1;
    }
}
